Unity3D相机操控(完整模拟Scene视图操作) |
您所在的位置:网站首页 › 正视图 俯视图 左视图右视图 › Unity3D相机操控(完整模拟Scene视图操作) |
文章目录
1. 需求2. 效果3. 逻辑梳理3.1 正交/透视视图的缓动切换3.2 拉近缩远3.3 上下左右拖拽相机
4 源码
1. 需求
一直想把Scene视图相机的操作复制到Game视图来,之前工作实现了一部分,但是不完善,前几天晚上抽空重新写了个。 在写的过程中遇到一些问题,这里记录一下。 Scene视图的操作总结如下: 1. 正交/透视视图的缓动切换 2. 滚动鼠标滚轮能够拉近、缩远 3. 按住鼠标中键能够上下左右拖拽相机 4. ALT+鼠标左键 或 按住鼠标右键 可360查看场景 5. 正视图、左视图、俯视图等 6. 按住F能够聚焦物体 7. ALT+鼠标右键 拖动鼠标能够放大缩小视角 8. 选中物体后,按住Shift+F,相机会一直跟随物体 这里实现了1~7,8没实现。 2. 效果先看看效果吧。 正交/透视切换。 360°查看。 聚焦和各种视图。 中键拖拽(物体始终保持在鼠标下方)。 缩放视角。 3. 逻辑梳理 3.1 正交/透视视图的缓动切换实现相机正交视图和透视视图缓动切换的核心是对相机的投影矩阵进行插值(从相机当前的投影矩阵插值到正交投影矩阵或者透视投影矩阵)。 分两个步骤: 根据相机的参数算出相机对应的透视投影矩阵和正交投影矩阵,如fieldOfView/aspect/orthographicSize/farClipPlane/nearClipPlane这些参数。 计算透视投影矩阵的公式如下。 // 透视投影矩阵. Matrix4x4 defaultPersProjMat = new Matrix4x4(); //defaultPersProjMat = Matrix4x4.Perspective(fov, aspect, near, far); // 透视矩阵也可直接调用这个来计算. defaultPersProjMat.SetRow(0, new Vector4(1.0f / (tan * aspect), 0, 0, 0)); defaultPersProjMat.SetRow(1, new Vector4(0, 1.0f / tan, 0, 0)); defaultPersProjMat.SetRow(2, new Vector4(0, 0, -(far + near) / (far - near), -2 * far * near / (far - near))); defaultPersProjMat.SetRow(3, new Vector4(0, 0, -1, 0));计算正交投影矩阵的公式如下。 // 正交投影矩阵. Matrix4x4 defaultOrthProjMat = new Matrix4x4(); defaultOrthProjMat.SetRow(0, new Vector4(1.0f / (aspect * size), 0, 0, 0)); defaultOrthProjMat.SetRow(1, new Vector4(0, 1.0f / size, 0, 0)); defaultOrthProjMat.SetRow(2, new Vector4(0, 0, -2f / (far - near), -(far + near) / (far - near))); defaultOrthProjMat.SetRow(3, new Vector4(0, 0, 0, 1)); 对投影矩阵进行插值 对矩阵插值其实也就是对矩阵中的各行进行插值。 public static Matrix4x4 MatrixLerp(Matrix4x4 from, Matrix4x4 to, float t) { t = Mathf.Clamp01(t); Matrix4x4 lerpMatrix = new Matrix4x4(); for (int i = 0; i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |